require(["config"], function() {
	require(["jquery", "template", "header", "cookie"], function($, template){
		//面向对象的方式创建
		function Cart(){
			this.products = null; // 保存购物车的商品数组结构
			this.load();
			this.addListener();
		}

		Cart.prototype = {
			constructor: Cart,
			// 加载，渲染页面，如果有选购的购物车商品，
			// 则显示商品信息，如果没有，则显示空的提示
			load: function(){
				// 配置 cookie 插件自动转换 JS 与 JSON
				$.cookie.json = true;
				//读取cookie中的数据
				var products = this.products = $.cookie("cart") || [];
				// 判断是否有购物车商品
				if (products.length === 0) { // 购物车为空
					//找到class为empty的dom元素，将他显示，将他的兄弟元素中的class中的not-empty的元素隐藏
					$(".empty").show().siblings(".not-empty").hide();
					return;
				}
				//源代码中 hidden中 权重为最高级 调用show函数 不行 权重不够
				$(".empty").hide().siblings(".not-empty").removeClass("hidden");
				//渲染模板
				var data = {products:products},
					html = template("cart-body-template", data);
				$(".cart-table tbody").html(html);
				//计算合计金额
				this.calcTotal();
			},
			//注册事件监听
			addListener: function(){
				//del删除
				$(".cart-table tbody").on("click", ".del", $.proxy(this.delHandler, this))
				// +/-数量
				$(".cart-table tbody").on("click", ".decrement,.increment", $.proxy(this.decIncHandler, this))
				//输入改变数量
				$(".cart-table tbody").on("blur", ".amount", $.proxy(this.inputHandler, this))
				
			},
			//del删除
			delHandler: function(event){
				//获取事件源元素（dom元素）
				var src = event.target;
				//获取事件源元素所在行（jquery对象）
				var tr = $(src).parents("tr");//在$(src)元素中的祖先元素的找到tr元素
				// 获取商品 id
				var id = tr.find(".id").text();//在tr的所有后代中找到id元素
				/**
				 * 通过filter来过滤掉删除的id数组
				 * @filter 为false的则过滤掉//不同写法
				 * this.products = this.products.filter(function(prod) {
				 * return !(prod.id == id);
				 * 	//if (prod.id == id)
				 * 	//	return false;
				 * 	//return true;
				 * });
				 */
				//从数组中删除该 id 对应的商品对象
				this.products = this.products.filter(prod=>!(prod.id == id));
				
				// 从 cookie 中保存的购物车结构中删除商品数据//覆盖修改
				$.cookie("cart", this.products, {expires: 10, path: "/"});
				// 从 DOM 树中删除 DOM 行结构
				tr.remove();//自己删除自己
				//计算合计金额
				this.calcTotal();
				// 判断是否有购物车商品
				if (this.products.length === 0) { // 购物车为空
					$(".empty").show().siblings(".not-empty").hide();
				}
			},
			// +/-数量处理
			decIncHandler: function(event){
				// 事件源元素（DOM）
				var src = event.target;
				//获取事件源元素所在行（jquery对象）
				var tr = $(src).parents("tr");//在$(src)元素中的祖先元素的找到tr元素
				// 获取商品 id
				var id = tr.find(".id").text();//在tr的所有后代中找到id元素
				//从数组中删除该 id 对应的商品对象
				//通过id过滤 返回一个数组 这个数组里面只有一个元素
				var product = this.products.filter(prod=>(prod.id == id))[0];
				// 判断+/-数量
				if($(src).is(".decrement")){// - 操作
					if(product.amount <= 1)
						return;
					product.amount--;
				}else{// + 操作
					product.amount++;
				}
				// 保存到 cookie 中（修改数量后的数组）
				$.cookie("cart", this.products, {expires: 10, path: "/"});
				// 页面渲染
				//数量
				tr.find(".amount").val(product.amount);
				//小计
				tr.find(".sub").text(product.amount*product.price);
				//计算合计金额
				this.calcTotal();
			},
			//输入改变数量
			inputHandler: function(event){
				// 事件源元素（DOM）
				var src = event.target;
				//获取事件源元素所在行（jquery对象）
				var tr = $(src).parents("tr");//在$(src)元素中的祖先元素的找到tr元素
				// 获取商品 id
				var id = tr.find(".id").text();//在tr的所有后代中找到id元素
				//从数组中删除该 id 对应的商品对象
				//通过id过滤 返回一个数组 这个数组里面只有一个元素
				var product = this.products.filter(prod=>(prod.id == id))[0];
				//修改数量
				//获取amount数量进行判断 是否格式有误
				var _amount = $(src).val();
				var reg = /^[1-9]\d*$/;
				if (!reg.test(_amount)) { // 格式有误，则还原为原有数量值 结束函数操作
					$(src).val(product.amount);
					return;
				}
				product.amount = _amount;
				// 保存到 cookie 中（修改数量后的数组）
				$.cookie("cart", this.products, {expires: 10, path: "/"});
				// 页面渲染
				//数量
				tr.find(".amount").val(product.amount);
				//小计
				tr.find(".sub").text(product.amount*product.price);
				//计算合计金额
				this.calcTotal();
			},
			// 计算选中行的合计金额
			calcTotal: function(){
				var sum = 0;
				//选中勾选框后的合计金额
				$(".ck_prod:checked").each(function(index, element){
					sum += Number($(this).parents("tr").find(".sub").text());
				});
				$(".total").text(sum);
			},
			// 部分选中处理
			ckProdHandler:function(event){
				
			}
		}
		new Cart();
	});
	
});